package baiduface

// Config 百度人脸识别API配置
type Config struct {
	APIKey    string 
	SecretKey string
}

 
// TokenResponse 获取Access Token的响应结构
type TokenResponse struct {
	AccessToken      string `json:"access_token"`
	ExpiresIn        int64  `json:"expires_in"`
	RefreshToken     string `json:"refresh_token"`
	Scope            string `json:"scope"`
	SessionKey       string `json:"session_key"`
	SessionSecret    string `json:"session_secret"`
	ErrorDescription string `json:"error_description,omitempty"`
	ERROR            string `json:"error,omitempty"`
}

// FaceDetectRequest 人脸检测请求参数
type FaceDetectRequest struct {
	// image 是 string 图片信息(总数据大小应小于10M，分辨率应小于1920*1080)，图片上传方式根据image_type来判断
	Image string `json:"image"`
	
	// image_type 是 string 图片类型
	// BASE64:（推荐）图片的base64值，base64编码后的图片数据，编码后的图片大小不超过2M；
	// FACE_TOKEN: 人脸图片的唯一标识，调用人脸检测接口时，会为每个人脸图片赋予一个唯一的FACE_TOKEN，同一张图片多次检测得到的FACE_TOKEN是同一个。
	ImageType string `json:"image_type"`
	
	// face_field 否 string 包括age,expression,face_shape,gender,glasses,landmark,landmark150,
	// quality,eye_status,emotion,face_type,mask,spoofing信息
	// 逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度
	FaceField string `json:"face_field,omitempty"`
	
	// max_face_num 否 uint32 最多处理人脸的数目，默认值为1，根据人脸检测排序类型检测图片中排序第一的人脸（默认为人脸面积最大的人脸），最大值20
	MaxFaceNum uint32 `json:"max_face_num,omitempty"`
	
	// face_type 否 string 人脸的类型
	// LIVE表示生活照：通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等
	// IDCARD表示身份证芯片照：二代身份证内置芯片中的人像照片
	// WATERMARK表示带水印证件照：一般为带水印的小图，如公安网小图
	// CERT表示证件照片：如拍摄的身份证、工卡、护照、学生证等证件图片
	// 默认LIVE
	FaceType string `json:"face_type,omitempty"`
	
	// liveness_control 否 string 活体控制 检测结果中不符合要求的人脸会被过滤
	// NONE: 不进行控制
	// LOW:较低的活体要求(高通过率 低攻击拒绝率)
	// NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
	// HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
	// 默认NONE
	LivenessControl string `json:"liveness_control,omitempty"`
	
	// face_sort_type 否 int 人脸检测排序类型
	// 0:代表检测出的人脸按照人脸面积从大到小排列
	// 1:代表检测出的人脸按照距离图片中心从近到远排列
	// 默认为0
	FaceSortType int `json:"face_sort_type,omitempty"`
	
	// display_corp_image 否 int 是否显示检测人脸的裁剪图base64值
	// 0：不显示（默认）
	// 1：显示
	// 当取值为1时，max_face_num字段的取值上限按5计算，即最多可返回5张人脸的裁剪图
	DisplayCorpImage int `json:"display_corp_image,omitempty"`
}

// FaceDetectResponse 人脸检测与属性分析响应结构体
type FaceDetectResponse struct {
	ErrorCode int    `json:"error_code"`
	ErrorMsg  string `json:"error_msg"`
	FaceNum   int    `json:"face_num"`   // 检测到的图片中的人脸数量
	FaceList  []Face `json:"face_list"`  // 人脸信息列表
}

// Face 人脸详细信息
type Face struct {
	FaceToken       string      `json:"face_token"`        // 人脸图片的唯一标识
	Location        Location    `json:"location"`          // 人脸在图片中的位置
	FaceProbability float64     `json:"face_probability"`  // 人脸置信度
	Angle           Angle       `json:"angle"`             // 人脸旋转角度参数
	Age             float64     `json:"age,omitempty"`     // 年龄
	Expression      Expression  `json:"expression,omitempty"` // 表情
	FaceShape       FaceShape   `json:"face_shape,omitempty"` // 脸型
	Gender          Gender      `json:"gender,omitempty"`     // 性别
	Glasses         Glasses     `json:"glasses,omitempty"`    // 眼镜
	EyeStatus       EyeStatus   `json:"eye_status,omitempty"` // 双眼状态
	Emotion         Emotion     `json:"emotion,omitempty"`    // 情绪
	FaceType        FaceType    `json:"face_type,omitempty"`  // 人脸类型
	Mask            Mask        `json:"mask,omitempty"`       // 口罩识别
	Landmark        []Landmark  `json:"landmark,omitempty"`   // 4个关键点位置
	Landmark72      []Landmark  `json:"landmark72,omitempty"` // 72个特征点位置
	Landmark150     Landmark150 `json:"landmark150,omitempty"`// 150个特征点位置
	Quality         Quality     `json:"quality,omitempty"`    // 人脸质量信息
	Liveness        Liveness    `json:"liveness,omitempty"`   // 活体信息
	Spoofing        float64     `json:"spoofing,omitempty"`   // 合成图概率
	NotSpoofing     float64     `json:"not_spoofing,omitempty"` // 非合成图概率
}

// Location 人脸在图片中的位置信息
type Location struct {
	Left   float64 `json:"left"`   // 人脸区域离左边界的距离
	Top    float64 `json:"top"`    // 人脸区域离上边界的距离
	Width  float64 `json:"width"`  // 人脸区域的宽度
	Height float64 `json:"height"` // 人脸区域的高度
	Rotate int64   `json:"rotation"` // 人脸框相对于竖直方向的顺时针旋转角，[-180,180]
}

// Angle 人脸角度信息
type Angle struct {
	Yaw   float64 `json:"yaw"`   // 三维旋转之左右旋转角[-90(左), 90(右)]
	Pitch float64 `json:"pitch"` // 三维旋转之俯仰角度[-90(上), 90(下)]
	Roll  float64 `json:"roll"`  // 平面内旋转角[-180(逆时针), 180(顺时针)]
}

// Expression 表情
type Expression struct {
	Type        string  `json:"type"`        // none:不笑；smile:微笑；laugh:大笑
	Probability float64 `json:"probability"` // 表情置信度，范围【0~1】
}

// FaceShape 脸型
type FaceShape struct {
	Type        string  `json:"type"`        // square: 正方形 triangle:三角形 oval: 椭圆 heart: 心形 round: 圆形
	Probability float64 `json:"probability"` // 置信度，范围【0~1】
}

// Gender 性别
type Gender struct {
	Type        string  `json:"type"`        // male:男性 female:女性
	Probability float64 `json:"probability"` // 性别置信度，范围【0~1】
}

// Glasses 眼镜
type Glasses struct {
	Type        string  `json:"type"`        // none:无眼镜，common:普通眼镜，sun:墨镜
	Probability float64 `json:"probability"` // 眼镜置信度，范围【0~1】
}

// EyeStatus 眼部状态
type EyeStatus struct {
	LeftEye  float64 `json:"left_eye"`  // 左眼状态 [0,1]取值，越接近0闭合的可能性越大
	RightEye float64 `json:"right_eye"` // 右眼状态 [0,1]取值，越接近0闭合的可能性越大
}

// Emotion 情绪
type Emotion struct {
	Type        string  `json:"type"`        // angry:愤怒 disgust:厌恶 fear:恐惧 happy:高兴 sad:伤心 surprise:惊讶 neutral:无表情 pouty: 撅嘴 grimace:鬼脸
	Probability float64 `json:"probability"` // 情绪置信度，范围0~1
}

// FaceType 人脸类型
type FaceType struct {
	Type        string  `json:"type"`        // human: 真实人脸 cartoon: 卡通人脸
	Probability float64 `json:"probability"` // 人脸类型判断正确的置信度，范围【0~1】
}

// Mask 口罩识别
type Mask struct {
	Type        int     `json:"type"`        // 0代表没戴口罩 1 代表戴口罩
	Probability float64 `json:"probability"` // 置信度，范围0~1
}

// Landmark 特征点位置
type Landmark struct {
	X float64 `json:"x"`
	Y float64 `json:"y"`
}

// Landmark150 150个特征点位置
type Landmark150 struct {
	ContourLeft0        Landmark `json:"contour_left_0"`
	ContourLeft16       Landmark `json:"contour_left_16"`
	ContourChin         Landmark `json:"contour_chin"`
	ContourRight16      Landmark `json:"contour_right_16"`
	ContourRight0       Landmark `json:"contour_right_0"`
	LeftEyeLeftCorner   Landmark `json:"left_eye_left_corner"`
	LeftEyeRightCorner  Landmark `json:"left_eye_right_corner"`
	LeftEyebrowLeftCorner Landmark `json:"left_eyebrow_left_corner"`
	LeftEyebrowRightCorner Landmark `json:"left_eyebrow_right_corner"`
	LeftEyebrowUpperLeftQuarter Landmark `json:"left_eyebrow_upper_left_quarter"`
	LeftEyebrowUpperMiddle  Landmark `json:"left_eyebrow_upper_middle"`
	LeftEyebrowUpperRightQuarter Landmark `json:"left_eyebrow_upper_right_quarter"`
	LeftEyebrowLowerLeftQuarter Landmark `json:"left_eyebrow_lower_left_quarter"`
	LeftEyebrowLowerMiddle Landmark `json:"left_eyebrow_lower_middle"`
	LeftEyebrowLowerRightQuarter Landmark `json:"left_eyebrow_lower_right_quarter"`
	RightEyeLeftCorner  Landmark `json:"right_eye_left_corner"`
	RightEyeRightCorner Landmark `json:"right_eye_right_corner"`
	RightEyebrowLeftCorner Landmark `json:"right_eyebrow_left_corner"`
	RightEyebrowRightCorner Landmark `json:"right_eyebrow_right_corner"`
	RightEyebrowUpperLeftQuarter Landmark `json:"right_eyebrow_upper_left_quarter"`
	RightEyebrowUpperMiddle Landmark `json:"right_eyebrow_upper_middle"`
	RightEyebrowUpperRightQuarter Landmark `json:"right_eyebrow_upper_right_quarter"`
	RightEyebrowLowerLeftQuarter Landmark `json:"right_eyebrow_lower_left_quarter"`
	RightEyebrowLowerMiddle Landmark `json:"right_eyebrow_lower_middle"`
	RightEyebrowLowerRightQuarter Landmark `json:"right_eyebrow_lower_right_quarter"`
	NoseTip             Landmark `json:"nose_tip"`
	NoseContourLeft1    Landmark `json:"nose_contour_left1"`
	NoseContourLeft2    Landmark `json:"nose_contour_left2"`
	NoseContourLeft3    Landmark `json:"nose_contour_left3"`
	NoseContourRight1   Landmark `json:"nose_contour_right1"`
	NoseContourRight2   Landmark `json:"nose_contour_right2"`
	NoseContourRight3   Landmark `json:"nose_contour_right3"`
	NoseContourLowerMiddle Landmark `json:"nose_contour_lower_middle"`
	MouthLeftCorner     Landmark `json:"mouth_left_corner"`
	MouthRightCorner    Landmark `json:"mouth_right_corner"`
	MouthUpperLipTop    Landmark `json:"mouth_upper_lip_top"`
	MouthLowerLipTop    Landmark `json:"mouth_lower_lip_top"`
	MouthUpperLipBottom Landmark `json:"mouth_upper_lip_bottom"`
	MouthLowerLipBottom Landmark `json:"mouth_lower_lip_bottom"`
	MouthContourLeft90  Landmark `json:"mouth_contour_left90"`
	MouthContourLeft80  Landmark `json:"mouth_contour_left80"`
	MouthContourLeft70  Landmark `json:"mouth_contour_left70"`
	MouthContourLeft60  Landmark `json:"mouth_contour_left60"`
	MouthContourLeft50  Landmark `json:"mouth_contour_left50"`
	MouthContourLeft40  Landmark `json:"mouth_contour_left40"`
	MouthContourLeft30  Landmark `json:"mouth_contour_left30"`
	MouthContourLeft20  Landmark `json:"mouth_contour_left20"`
	MouthContourLeft10  Landmark `json:"mouth_contour_left10"`
	MouthContourUpperLipTop Landmark `json:"mouth_contour_upper_lip_top"`
	MouthContourUpperLipBottom Landmark `json:"mouth_contour_upper_lip_bottom"`
	MouthContourLowerLipTop Landmark `json:"mouth_contour_lower_lip_top"`
	MouthContourLowerLipBottom Landmark `json:"mouth_contour_lower_lip_bottom"`
	MouthContourRight10 Landmark `json:"mouth_contour_right10"`
	MouthContourRight20 Landmark `json:"mouth_contour_right20"`
	MouthContourRight30 Landmark `json:"mouth_contour_right30"`
	MouthContourRight40 Landmark `json:"mouth_contour_right40"`
	MouthContourRight50 Landmark `json:"mouth_contour_right50"`
	MouthContourRight60 Landmark `json:"mouth_contour_right60"`
	MouthContourRight70 Landmark `json:"mouth_contour_right70"`
	MouthContourRight80 Landmark `json:"mouth_contour_right80"`
	MouthContourRight90 Landmark `json:"mouth_contour_right90"`
}

// Quality 人脸质量信息
type Quality struct {
	Occlusion       Occlusion `json:"occlusion"`       // 人脸各部分遮挡的概率
	Blur            float64   `json:"blur"`            // 人脸模糊程度，范围[0~1]
	Illumination    float64   `json:"illumination"`    // 脸部区域的光照程度，取值范围在[0~255]
	Completeness    int64     `json:"completeness"`    // 人脸完整度，0或1
}

// Occlusion 遮挡范围
type Occlusion struct {
	LeftEye     float64 `json:"left_eye"`      // 左眼遮挡比例
	RightEye    float64 `json:"right_eye"`     // 右眼遮挡比例
	Nose        float64 `json:"nose"`          // 鼻子遮挡比例
	Mouth       float64 `json:"mouth"`         // 嘴巴遮挡比例
	LeftCheek   float64 `json:"left_cheek"`    // 左脸颊遮挡比例
	RightCheek  float64 `json:"right_cheek"`   // 右脸颊遮挡比例
	Chin        float64 `json:"chin"`  // 下巴遮挡比例
}

// Liveness 活体信息
type Liveness struct {
	LiveMapScore float64 `json:"livemapscore"` // 单张图片的活体得分范围[0~1]
}